callback 함수

최근 수정 시각: (5년 전)
분류
목차
1. 개요2. 예시

1. 개요 [편집]

함수의 호출 실행 시점을 프로그래머가 아닌 시스템에서 결정하는 함수.

2. 예시 [편집]

Windows API를 예로 들자면
#include <windows.h>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
HINSTANCE g_hInst;
LPSTR lpszClass = "First";

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
		  LPSTR lpszCmdParam, int nCmdShow)
{
	HWND hWnd;
	MSG Message;
	WNDCLASS WndClass;
	g_hInst = hInstance;
	
	WndClass.cbClsExtra = 0;
	WndClass.cbWndExtra = 0;
	WndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
	WndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
	WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
	WndClass.hInstance = hInstance;
	WndClass.lpfnWndProc = (WNDPROC)WndProc;
	WndClass.lpszClassName = lpszClass;
	WndClass.lpszMenuName = NULL;
	WndClass.style = CS_HREDRAW | CS_VREDRAW;
	RegisterClass(&WndClass);

	hWnd=CreateWindow(lpszClass,lpszClass, WS_OVERLAPPEDWINDOW,
		  CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
		  NULL, (HMENU)NULL, hInstance, NULL);
	ShowWindow(hWnd, nCmdShow);
	
	while(GetMessage(&Message, 0, 0, 0)) {
		TranslateMessage(&Message);
		DispatchMessage(&Message);
	}
	return Message.wParam;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)
{
	switch(iMessage) {
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	}
	return(DefWindowProc(hWnd, iMessage, wParam, lParam));
}

이때 WndProc 함수는 프로그래머가 직접 호출하는 것이 아닌 프로세스에 이벤트가 들어왔을 때 DispatchMessage 함수를 호출하여 이벤트를 처리하며 시스템에서 WndProc를 호출한다. 호출의 주도권을 프로그래머가 아닌 시스템이 쥔다.

이런 콜백함수를 주로 볼 수 있는 경우는 Node.js에서 볼 수 있는데, Node.js의 특성상 비동기처리가 많기 때문에 처리의 결과를 프로그래머가 받기 위해서는 콜백함수를 사용하여 시스템이 결과값을 콜백함수를 호출하여 넘겨주기 때문이다. Node.js는 이게 숱하게 중첩되는 경우가 많아 콜백 지옥이라는 별명까지 붙었을 정도.

예를 들어 pbkdf2는 문자열의 해시를 계산하는 함수이며 그 처리시간이 오래 걸린다. 그 처리시간을 그저 기다리지 말고 다른 작업를 하여 전체 처리 시간을 줄일 수 있다.
const crypto = require('crypto');
crypto.pbkdf2('secret', 'salt', 100000, 512, 'sha512', (err, key) => {
  if (err) throw err;
  console.log(key.toString('hex'));  // 'c5e478d...1469e50'
});
console.log("main ended.");


라이선스를 별도로 명시하지 않은 문서는 CC BY-NC-SA 2.0 KR에 따라 이용할 수 있습니다.
기여하신 문서의 저작권은 각 기여자에게 있으며, 각 기여자는 기여하신 부분의 저작권을 갖습니다.

문서의 기여자는 역사 탭에서 확인할 수 있습니다.
접두어의 N: - 나무위키 사용자, R: - 리그베다 위키의 사용자를 뜻합니다.
자세한 사항은 나무위키에서 동일한 문서의 역사를 참고하시기 바랍니다.